Asynchronous Programming (অ্যাসিনক্রোনাস প্রোগ্রামিং)

Computer Programming - নোড জেএস (Node.js)
162

অ্যাসিনক্রোনাস প্রোগ্রামিং এমন একটি প্রোগ্রামিং কৌশল যেখানে কিছু কাজ সম্পন্ন হওয়ার জন্য অপেক্ষা না করে, পরবর্তী কাজগুলো চালিয়ে যাওয়া হয়। এতে, কাজগুলো একে অপরকে বাধাগ্রস্ত না করে, সমান্তরালভাবে সম্পন্ন হতে পারে। এটি বিশেষভাবে উপকারী যখন আপনি দীর্ঘ সময় নেয় এমন কাজ, যেমন ফাইল সিস্টেমে লেখা, নেটওয়ার্ক রিকোয়েস্ট করা, ডেটাবেস অপারেশন বা ইন্টারনাল ক্যালকুলেশন ইত্যাদি করতে চান, কিন্তু সেই কাজগুলির জন্য অপেক্ষা না করে অন্যান্য কাজ চলতে থাকবে।

Node.js এবং অন্যান্য JavaScript ভিত্তিক পরিবেশে অ্যাসিনক্রোনাস প্রোগ্রামিং ব্যাপকভাবে ব্যবহৃত হয়। এখানে, বিভিন্ন অ্যাসিনক্রোনাস কৌশল এবং তাদের ব্যবহারের উদাহরণ দেওয়া হলো।


১. Callback Functions (কলব্যাক ফাংশন)

অ্যাসিনক্রোনাস প্রোগ্রামিংয়ের সবচেয়ে মৌলিক ধারণা হলো callback functions। যখন একটি কাজ সম্পন্ন হবে, তখন সেই কাজের ফলাফল পরবর্তী ধাপে পাঠাতে কলব্যাক ফাংশন ব্যবহার করা হয়। কলব্যাক ফাংশন একটি অ্যাসিনক্রোনাস অপারেশন সম্পন্ন হওয়ার পর চালানো হয়।

উদাহরণ:

const fs = require('fs');

// ফাইল পড়ার অ্যাসিনক্রোনাস অপারেশন
fs.readFile('example.txt', 'utf8', (err, data) => {
  if (err) {
    console.error('Error reading file:', err);
  } else {
    console.log('File content:', data);
  }
});

console.log('File reading initiated');

এখানে fs.readFile() একটি অ্যাসিনক্রোনাস অপারেশন, যেখানে ফাইল পড়া শুরু করা হচ্ছে, কিন্তু console.log('File reading initiated') দ্রুত এক্সিকিউট হবে। ফাইল পড়া শেষ হলে কলব্যাক ফাংশন চালানো হবে এবং কন্টেন্ট প্রিন্ট হবে।


২. Promises (প্রমিসেস)

Promises হলো একটি উন্নত অ্যাসিনক্রোনাস প্রোগ্রামিং কৌশল যা অ্যাসিনক্রোনাস অপারেশন সম্পন্ন হওয়ার প্রেক্ষিতে একটি মানের (value) বা ত্রুটির (error) প্রতিশ্রুতি প্রদান করে। এটি অ্যাসিনক্রোনাস প্রোগ্রামিংকে আরও ক্লিন এবং পাঠযোগ্য করে তোলে।

প্রমিস একটি অবজেক্ট যা ভবিষ্যতে (future) একটি মান বা ত্রুটি প্রদান করবে।

উদাহরণ:

const fs = require('fs');

// প্রমিস ব্যবহার করে ফাইল পড়া
const readFilePromise = new Promise((resolve, reject) => {
  fs.readFile('example.txt', 'utf8', (err, data) => {
    if (err) {
      reject('Error reading file');
    } else {
      resolve(data);
    }
  });
});

readFilePromise
  .then((data) => {
    console.log('File content:', data);
  })
  .catch((error) => {
    console.error(error);
  });

console.log('File reading initiated');

এখানে, readFilePromise একটি প্রমিস তৈরি করে। যখন ফাইলটি পড়া শেষ হবে, তখন resolve() বা reject() এর মাধ্যমে ফলাফল বা ত্রুটি পাঠানো হবে। then() এবং catch() মেথডের মাধ্যমে আমরা প্রমিসের ফলাফল বা ত্রুটি হ্যান্ডেল করতে পারি।


৩. Async/Await (এ্যাসিঙ্ক/অ্যাওয়েট)

Async/Await হলো JavaScript এর একটি নতুন ফিচার যা প্রমিস ভিত্তিক অ্যাসিনক্রোনাস কোড আরও সহজ এবং পাঠযোগ্য করে তোলে। async কিওয়ার্ড একটি ফাংশনকে অ্যাসিনক্রোনাস করে তোলে, এবং await কিওয়ার্ড ব্যবহার করে আপনি প্রমিসের ফলাফল পর্যন্ত অপেক্ষা করতে পারেন।

উদাহরণ:

const fs = require('fs').promises;  // fs মডিউলের প্রমিস সংস্করণ ব্যবহার

// অ্যাসিঙ্ক/অ্যাওয়েট ব্যবহার
async function readFile() {
  try {
    const data = await fs.readFile('example.txt', 'utf8');
    console.log('File content:', data);
  } catch (error) {
    console.error('Error reading file:', error);
  }
}

readFile();
console.log('File reading initiated');

এখানে readFile ফাংশনটি অ্যাসিনক্রোনাস এবং await কিওয়ার্ড ব্যবহার করে ফাইল পড়া হচ্ছে। await ফাংশনটি প্রমিসের ফলাফল পর্যন্ত অপেক্ষা করে, এবং তারপর পরবর্তী কোড এক্সিকিউট হয়।


৪. Event-driven Programming (ইভেন্ট-ড্রিভেন প্রোগ্রামিং)

Node.js এ অ্যাসিনক্রোনাস প্রোগ্রামিং বিশেষভাবে ইভেন্ট-ড্রিভেন আর্কিটেকচারের মাধ্যমে বাস্তবায়িত হয়। এই আর্কিটেকচারে কোড নির্দিষ্ট ইভেন্টের জন্য অপেক্ষা করে এবং সেই ইভেন্টের জন্য কলব্যাক ফাংশন চালানো হয়। EventEmitter ক্লাস এর মাধ্যমে ইভেন্ট ড্রিভেন প্রোগ্রামিং সহজ হয়।

উদাহরণ:

const EventEmitter = require('events');
const emitter = new EventEmitter();

// কলব্যাক যোগ করা
emitter.on('dataReceived', () => {
  console.log('Data has been received!');
});

// ইভেন্ট ট্রিগার করা
setTimeout(() => {
  emitter.emit('dataReceived');
}, 2000); // 2 সেকেন্ড পর ইভেন্ট ট্রিগার হবে

এখানে, setTimeout() ফাংশন একটি অ্যাসিনক্রোনাস অপারেশন, যা ২ সেকেন্ড পর "dataReceived" ইভেন্ট ট্রিগার করবে এবং কলব্যাক ফাংশনটি চালানো হবে।


৫. অ্যাসিনক্রোনাস I/O অপারেশন

অ্যাসিনক্রোনাস প্রোগ্রামিং মূলত দীর্ঘ সময় নেয় এমন কাজের জন্য ব্যবহৃত হয়, যেমন ফাইল সিস্টেমে কাজ করা, ডাটাবেস অপারেশন, বা নেটওয়ার্ক রিকোয়েস্ট। Node.js এ এমন কাজগুলো অ্যাসিনক্রোনাসভাবে করা হয়, যাতে অন্য কাজগুলো চলতে থাকে এবং সার্ভারের পারফরম্যান্স ভাল থাকে।

উদাহরণ (অ্যাসিনক্রোনাস ফাইল সিস্টেম):

const fs = require('fs');

fs.readFile('example.txt', 'utf8', (err, data) => {
  if (err) {
    console.error('Error:', err);
  } else {
    console.log('File content:', data);
  }
});

console.log('Reading file...');

এখানে ফাইল পড়া হচ্ছে অ্যাসিনক্রোনাসভাবে, এবং অন্য কাজ (console.log('Reading file...')) চলতে থাকে।


সারাংশ

অ্যাসিনক্রোনাস প্রোগ্রামিং হল এমন একটি কৌশল যা কোডের কার্যকারিতা উন্নত করে এবং দীর্ঘ সময় নেয় এমন কাজের জন্য অপেক্ষা না করে অন্য কাজ করতে সাহায্য করে। JavaScript এবং Node.js এ অ্যাসিনক্রোনাস প্রোগ্রামিংয়ের জন্য callback functions, Promises, এবং async/await ব্যবহার করা হয়। Node.js এ ইভেন্ট-ড্রিভেন আর্কিটেকচারও অ্যাসিনক্রোনাস প্রোগ্রামিংয়ের গুরুত্বপূর্ণ অংশ, যা ইভেন্ট ইমিটারসের মাধ্যমে কার্যকরীভাবে ব্যবহৃত হয়।

Content added By

Asynchronous Programming এর মৌলিক ধারণা

187

Asynchronous Programming হল এমন একটি প্রোগ্রামিং পদ্ধতি যেখানে কোড একে অপরের সাথে সিঙ্ক্রোনাইজ হয়ে না চলতে পারে, বরং একাধিক কাজ বা অপারেশন সেগুলি সম্পন্ন হওয়ার জন্য অপেক্ষা না করে একসাথে চলে। এটি সিস্টেমের পারফরম্যান্স উন্নত করতে সাহায্য করে, বিশেষ করে যখন কোনো আই/ও (Input/Output) অপারেশন, যেমন ডেটাবেস কুয়েরি, ফাইল সিস্টেমের সাথে কাজ বা নেটওয়ার্ক রিকোয়েস্টের মতো সময়সাপেক্ষ কাজ করতে হয়।

এটি non-blocking প্রক্রিয়া ব্যবহার করে, যার মানে হল যে কোনো অপারেশন সম্পন্ন না হওয়া পর্যন্ত অন্যান্য কাজ আটকে থাকে না, বরং এগুলি পাশাপাশি চলে।


১. Synchronous vs Asynchronous

  • Synchronous Programming: যখন একটি কাজ সম্পন্ন না হওয়া পর্যন্ত পরবর্তী কাজ শুরু হয় না, তখন এটি সিনক্রোনাস (Synchronous) প্রোগ্রামিং। এতে একে একে কাজগুলো সম্পন্ন হয়, এবং পরবর্তী কাজ পূর্ববর্তী কাজের উপর নির্ভর করে।
  • Asynchronous Programming: এখানে, একাধিক কাজ একসাথে চলতে পারে। কোনো একক কাজের জন্য অন্য কাজ থেমে থাকে না। আপনি যদি একটি আই/ও অপারেশন করেন, তবে সেই অপারেশনটি শেষে হতে না হতেই অন্য কাজ চলতে থাকে এবং ফলস্বরূপ সময় সাশ্রয় হয়।

উদাহরণ:

  • Synchronous:

    console.log("Start");
    console.log("Processing...");
    console.log("Done");
  • Asynchronous:

    console.log("Start");
    
    setTimeout(() => {
      console.log("Processing...");
    }, 2000); // 2 সেকেন্ড পর "Processing..." প্রদর্শিত হবে
    
    console.log("Done");

এখানে, Synchronous উদাহরণে সব কনসোলে একে একে প্রদর্শিত হয়, কিন্তু Asynchronous উদাহরণে setTimeout ফাংশনটি 2 সেকেন্ড পর কলব্যাক ফাংশন চালাবে, এবং তার আগে "Done" দেখাবে।


২. Callbacks (কলব্যাক)

Callback হল এমন একটি ফাংশন যা অন্য একটি ফাংশনের মধ্যে পাস করা হয় এবং সেই ফাংশনটি তার কার্য সম্পন্ন হওয়ার পর কলব্যাক ফাংশনটি চালায়।

Asynchronous প্রোগ্রামিংয়ে, কলব্যাক ফাংশন অত্যন্ত গুরুত্বপূর্ণ। যেমন, নেটওয়ার্ক রিকোয়েস্ট বা টাইমিং ইভেন্টগুলির পরে কলব্যাক ফাংশনটি কল করা হয়।

উদাহরণ:

console.log("Start");

setTimeout(() => {
  console.log("Processing...");
}, 2000); // 2 সেকেন্ড পর

console.log("Done");

এখানে, setTimeout একটি অ্যাসিনক্রোনাস ফাংশন যা কলব্যাক ফাংশনকে 2 সেকেন্ড পর চালাবে।


৩. Promises

Promises হল একটি আধুনিক ধারণা যা Asynchronous প্রোগ্রামিং সহজ এবং আরো পরিস্কার করে তোলে। একটি প্রমিস একটি ভবিষ্যত সময়ে কোনো কাজের সফল বা ব্যর্থ ফলাফল নিশ্চিত করার একটি উপায়। এটি Pending, Resolved বা Rejected অবস্থায় থাকতে পারে।

Promise উদাহরণ:

let promise = new Promise((resolve, reject) => {
  let success = true;

  if (success) {
    resolve("Operation successful!");
  } else {
    reject("Operation failed!");
  }
});

promise
  .then((message) => {
    console.log(message); // 'Operation successful!'
  })
  .catch((message) => {
    console.log(message); // 'Operation failed!'
  });

এখানে, প্রমিসটি একটি অ্যাসিনক্রোনাস অপারেশন যা সফল হলে resolve() এবং ব্যর্থ হলে reject() চালাবে। then() মেথড সফল হলে এবং catch() মেথড ব্যর্থ হলে কলব্যাক ফাংশনগুলি চালায়।


৪. Async/Await

Async/Await হল Promises এর উপর ভিত্তি করে একটি নতুন সিনট্যাক্স যা Asynchronous কোড লেখাকে আরো সহজ করে তোলে। async ফাংশনটি একটি প্রমিস রিটার্ন করে এবং await অপারেটরটি প্রমিসের ফলাফল পাওয়ার জন্য অপেক্ষা করে, তবে এটি ব্লকিং হয় না।

Async/Await উদাহরণ:

async function fetchData() {
  let promise = new Promise((resolve, reject) => {
    setTimeout(() => resolve("Data fetched!"), 2000);
  });

  let result = await promise; // এখানে promise সম্পন্ন হওয়া পর্যন্ত অপেক্ষা করা হয়
  console.log(result); // 'Data fetched!'
}

fetchData();

এখানে, async ফাংশনটি একটি প্রমিস রিটার্ন করবে এবং await এটিকে সম্পন্ন হওয়া পর্যন্ত অপেক্ষা করবে। await ব্যবহার করলে কোড আরও পড়তে সহজ হয় এবং asynchronous কোড লেখার সময় callback হেল বা "callback hell" থেকে মুক্তি পাওয়া যায়।


৫. Event Loop

Node.js এ Event Loop একটি গুরুত্বপূর্ণ কনসেপ্ট। এটি অ্যাসিনক্রোনাস অপারেশনগুলো পরিচালনা করে। যখন কোনো অ্যাসিনক্রোনাস কাজ (যেমন ফাইল পড়া, HTTP রিকোয়েস্ট) শুরু হয়, Node.js সেগুলি ইনিশিয়েট করে এবং Event Loop এ একটি কলব্যাক ফাংশনকে পুশ করে। যখন অপারেশনটি সম্পন্ন হয়, তখন Event Loop কলব্যাক ফাংশনটি চালায়।

এটি Node.js এর non-blocking মেকানিজমকে সমর্থন করে এবং নিশ্চিত করে যে একসাথে একাধিক কাজ চলতে পারে।


সারাংশ

Asynchronous Programming হল এমন একটি প্রোগ্রামিং পদ্ধতি যা কোডের কার্যকারিতা বৃদ্ধি করে এবং প্রোগ্রামের পারফরম্যান্স উন্নত করে। এর মাধ্যমে একাধিক কাজ একসাথে চলতে পারে এবং একটি কাজের জন্য অন্য কাজ থেমে থাকে না।

  • Callbacks: Asynchronous কাজের জন্য কলব্যাক ফাংশন ব্যবহৃত হয়।
  • Promises: একটি আধুনিক পদ্ধতি যা কোডের কাঠামো উন্নত করে এবং প্রমিসের সফল বা ব্যর্থ ফলাফল সংগ্রহ করতে সাহায্য করে।
  • Async/Await: Promise এর ওপর ভিত্তি করে কোড লেখাকে আরও সহজ এবং পরিষ্কার করে তোলে।

এই ধারণাগুলি Asynchronous প্রোগ্রামিংয়ের মূল ভিত্তি এবং এটি Node.js এর ইভেন্ট-ড্রিভেন আর্কিটেকচারের একটি অংশ।

Content added By

Callback Functions এর ব্যবহার

200

Callback Functions হলো একটি ফাংশন যা অন্য একটি ফাংশনের আর্গুমেন্ট হিসেবে পাঠানো হয় এবং সেই ফাংশনটি সম্পন্ন হওয়ার পর কলব্যাক ফাংশনটি কার্যকরী হয়। Node.js এর মতো অ্যাসিনক্রোনাস পরিবেশে, কলব্যাক ফাংশনগুলি একটি অপরিহার্য অংশ, কারণ এগুলির মাধ্যমে অ্যাসিনক্রোনাস কার্যক্রম সঠিকভাবে পরিচালিত হয়।

Node.js-এ, যখন আপনি কিছু সময়সাপেক্ষ কাজ (যেমন ফাইল পড়া, HTTP রিকোয়েস্ট, ডেটাবেস কুয়েরি ইত্যাদি) করেন, তখন আপনি কলব্যাক ফাংশন ব্যবহার করে ওই কাজ সম্পন্ন হওয়ার পর যা করার প্রয়োজন তা নির্দিষ্ট করতে পারেন।


Callback Function কী?

একটি callback function হলো একটি ফাংশন যা অন্য ফাংশনকে আর্গুমেন্ট হিসেবে পাঠানো হয় এবং পরবর্তী সময়ে কার্যকর হয়, সাধারণত যখন অন্য ফাংশনটির কার্যক্রম সম্পন্ন হয়।

ধারণা:

function mainFunction(callback) {
  console.log("Main function is executing...");
  callback(); // কলব্যাক ফাংশন কল করা
}

function callbackFunction() {
  console.log("Callback function is executing after the main function.");
}

mainFunction(callbackFunction);

Output:

Main function is executing...
Callback function is executing after the main function.

১. Callback Functions in Asynchronous Operations

Node.js-এ সাধারণত অ্যাসিনক্রোনাস কার্যক্রমে callback ব্যবহার করা হয়, যেখানে আপনি একটি কাজ শুরু করার পর, সেই কাজের সম্পন্ন হওয়ার পর কলব্যাক ফাংশনটি রান করান।

উদাহরণ: ফাইল পড়ার জন্য কলব্যাক ফাংশন ব্যবহার

Node.js এর fs (File System) মডিউল ব্যবহার করে ফাইল পড়ার সময় কলব্যাক ফাংশন ব্যবহার করা হয়।

const fs = require('fs');

// ফাইল পড়ার জন্য অ্যাসিনক্রোনাস ফাংশন
fs.readFile('example.txt', 'utf8', (err, data) => {
  if (err) {
    console.log('Error reading file:', err);
  } else {
    console.log('File content:', data);
  }
});

console.log('File read initiated...');

Output:

File read initiated...
File content: Hello, this is a test file.

এখানে, fs.readFile() একটি অ্যাসিনক্রোনাস ফাংশন। এটি ফাইলটি পড়তে সময় নেয়, কিন্তু callback ফাংশনটি কেবল তখনই চালানো হয় যখন ফাইল পড়া সম্পন্ন হয়। আপনি দেখতে পাচ্ছেন যে, "File read initiated..." প্রথমে আউটপুট হয়, এবং তারপর ফাইলের কন্টেন্ট প্রদর্শিত হয়।


২. Error Handling in Callback Functions

অ্যাসিনক্রোনাস কলব্যাক ফাংশনের একটি সাধারণ ব্যবহার হলো error handling। কলব্যাক ফাংশনে err নামক প্রথম আর্গুমেন্টটি থাকে যা কোনো ত্রুটি ঘটলে তাতে তথ্য ধারণ করে। আপনি এই ত্রুটির ভিত্তিতে কার্যক্রম পরিচালনা করতে পারেন।

উদাহরণ: ফাইল লেখার জন্য কলব্যাক ফাংশন

const fs = require('fs');

// ফাইল লেখার জন্য অ্যাসিনক্রোনাস ফাংশন
fs.writeFile('output.txt', 'Hello, this is new content!', (err) => {
  if (err) {
    console.log('Error writing to file:', err);
  } else {
    console.log('File written successfully!');
  }
});

এখানে, fs.writeFile() ফাংশনটি ফাইল লেখার কাজ সম্পন্ন হওয়ার পর কলব্যাক ফাংশনটি রান করায় এবং ত্রুটি থাকলে তা err আর্গুমেন্টে পাওয়া যায়।


৩. Nested Callback Functions (Callback Hell)

যখন একের পর এক কলব্যাক ফাংশন nest করা হয়, তখন এটি callback hell বা pyramid of doom হিসেবে পরিচিত হয়। এর ফলে কোড পড়া এবং রক্ষণাবেক্ষণ করা কঠিন হয়ে পড়ে।

উদাহরণ: Nested Callback

setTimeout(() => {
  console.log('Step 1: Task completed.');
  setTimeout(() => {
    console.log('Step 2: Task completed.');
    setTimeout(() => {
      console.log('Step 3: Task completed.');
      // আরও nested callbacks হতে পারে
    }, 1000);
  }, 1000);
}, 1000);

এখানে, একের পর এক কলব্যাক নেস্ট করা হয়েছে, যা কোডের পাঠযোগ্যতা এবং রক্ষণাবেক্ষণ জটিল করে তোলে।


৪. Promises এবং Async/Await

Callback Hell সমস্যার সমাধান হিসেবে Promises এবং Async/Await ব্যবহার করা হয়। এগুলি কোডকে আরও পরিষ্কার এবং রিডেবল করে তোলে। কিন্তু, কলব্যাক ফাংশন এখনো অনেক অ্যাসিনক্রোনাস অ্যাপ্লিকেশনে ব্যবহৃত হয়, বিশেষত যখন একাধিক কার্যক্রমে কলব্যাকের প্রয়োজন হয়।


৫. Multiple Callbacks with async library

যখন একাধিক কলব্যাক থাকে, তখন async.js লাইব্রেরি ব্যবহার করে সহজে সিঙ্ক্রোনাইজড কলব্যাক পরিচালনা করা যায়।

const async = require('async');

// Multiple functions executed sequentially
async.series([
  function(callback) {
    console.log('Task 1 started');
    callback(null, 'Result from Task 1');
  },
  function(callback) {
    console.log('Task 2 started');
    callback(null, 'Result from Task 2');
  }
], function(err, results) {
  if (err) {
    console.log('Error occurred:', err);
  } else {
    console.log('Final results:', results);
  }
});

এখানে async.series() ব্যবহার করে কলব্যাক ফাংশনগুলো সিকোয়েনশিয়ালি (ধাপে ধাপে) রান করানো হচ্ছে, এবং শেষে results প্রদর্শিত হবে।


সারাংশ

  • Callback functions হল ফাংশন যেগুলি অন্য ফাংশনকে আর্গুমেন্ট হিসেবে পাঠানো হয় এবং সেই ফাংশনটি সম্পন্ন হওয়ার পর কলব্যাক ফাংশনটি কার্যকরী হয়।
  • Node.js-এ callback functions অ্যাসিনক্রোনাস কার্যক্রম পরিচালনা করার জন্য ব্যবহৃত হয়, যেমন ফাইল অপারেশন, HTTP রিকোয়েস্ট, ডেটাবেস কুয়েরি ইত্যাদি।
  • Callback hell একটি সমস্যা হতে পারে যখন একাধিক কলব্যাক নেস্ট করা হয়, তবে Promises এবং Async/Await ব্যবহার করে এই সমস্যা সমাধান করা সম্ভব।
  • Async.js লাইব্রেরি ব্যবহার করে একাধিক কলব্যাক সহজভাবে পরিচালনা করা যায়।

Callback functions Node.js এর মধ্যে অ্যাসিনক্রোনাস কার্যক্রম সঠিকভাবে পরিচালনা করতে সহায়তা করে, যা দ্রুত পারফরম্যান্স এবং স্কেলেবিলিটি নিশ্চিত করে।

Content added By

Promises এবং Error Handling

203

Promises এবং Error Handling হল JavaScript এর দুটি গুরুত্বপূর্ণ ধারণা, যা অ্যাসিনক্রোনাস প্রোগ্রামিং ও ত্রুটি পরিচালনায় সাহায্য করে। এগুলি প্রোগ্রামিংয়ের মধ্যে সিঙ্ক্রোনাস এবং অ্যাসিনক্রোনাস কার্যকলাপের মধ্যে একটি সুসংগঠিত সমন্বয় নিশ্চিত করে এবং ডেভেলপারদের উন্নত মানের কোড লিখতে সহায়তা করে।


১. Promises

Promises হল অ্যাসিনক্রোনাস অপারেশনের ফলাফল যেটি ভবিষ্যতে কোনো সময় পাওয়া যাবে। একটি promise একটি ফলাফলকে তিনটি অবস্থার মধ্যে রাখে:

  • Pending: Promise তৈরি করা হয়েছে, কিন্তু ফলাফল এখনো পাওয়া যায়নি।
  • Resolved (Fulfilled): Promise সফলভাবে সম্পন্ন হয়েছে এবং একটি মান (value) ফিরিয়েছে।
  • Rejected: Promise ব্যর্থ হয়েছে এবং একটি ত্রুটি (error) ফিরিয়েছে।

Promise একটি অবজেক্ট হিসেবে রিটার্ন হয় যা অ্যাসিনক্রোনাস কাজের ফলাফল সংরক্ষণ করে এবং পরে .then() বা .catch() মেথডের মাধ্যমে সে ফলাফল বা ত্রুটি ব্যবস্থাপনা করা যায়।

Promise তৈরি করা:

// একটি promise তৈরি করা
let promise = new Promise((resolve, reject) => {
  let success = true; // এখানে success কে false করলে promise reject হবে

  if (success) {
    resolve("Operation successful!");  // Promise সফল হলে
  } else {
    reject("Operation failed!");  // Promise ব্যর্থ হলে
  }
});

Promise ব্যবহার করা:

  1. .then(): Promise সফল হলে .then() মেথড ব্যবহার করা হয়।
  2. .catch(): Promise ব্যর্থ হলে .catch() মেথড ব্যবহার করা হয়।
promise
  .then((message) => {
    console.log(message);  // "Operation successful!"
  })
  .catch((error) => {
    console.log(error);  // "Operation failed!"
  });

Promise Chain:

একটি promise এর উপর আরেকটি promise চেইন করা যেতে পারে। এটি সিরিয়াল অ্যাসিনক্রোনাস কাজগুলো সম্পন্ন করতে ব্যবহৃত হয়।

let promise1 = new Promise((resolve) => {
  resolve("First step done");
});

promise1
  .then((message) => {
    console.log(message);
    return "Second step done";  // পরবর্তী promise রিটার্ন
  })
  .then((message) => {
    console.log(message);  // "Second step done"
    return "Third step done";  // পরবর্তী promise রিটার্ন
  })
  .then((message) => {
    console.log(message);  // "Third step done"
  })
  .catch((error) => {
    console.log("Error:", error);  // যদি কোনো ত্রুটি ঘটে
  });

২. Error Handling in Promises

Error Handling হল অ্যাসিনক্রোনাস কোডে ত্রুটির সঠিকভাবে চিহ্নিত করা এবং তার জন্য প্রতিক্রিয়া দেওয়া। JavaScript এ, Promise ব্যবহারের সময় .catch() মেথড দিয়ে ত্রুটি পরিচালনা করা যায়।

Error Handling উদাহরণ:

let promise = new Promise((resolve, reject) => {
  let success = false;  // আমরা ইচ্ছাকৃতভাবে fail করছি

  if (success) {
    resolve("Task completed successfully");
  } else {
    reject("An error occurred");
  }
});

promise
  .then((message) => {
    console.log(message);  // যদি promise সফল হয়
  })
  .catch((error) => {
    console.log("Caught error:", error);  // যদি promise ব্যর্থ হয়
  });

এখানে, success যদি false থাকে তবে Promise reject হবে এবং .catch() মেথডে ত্রুটি ধরা হবে।

Async/Await এর সাথে Error Handling

async এবং await হল নতুন সিনট্যাক্স, যা promises এর কাজকে আরও সোজা এবং সুন্দর করে তোলে। await এর মাধ্যমে আপনি Promise এর ফলাফল সরাসরি অ্যাসিঙ্ক্রোনাসভাবে গ্রহণ করতে পারেন এবং try...catch দিয়ে ত্রুটি পরিচালনা করা হয়।

উদাহরণ: Async/Await Error Handling
// একটি অ্যাসিনক্রোনাস ফাংশন তৈরি করা
async function fetchData() {
  try {
    let result = await new Promise((resolve, reject) => {
      let success = false;  // ইচ্ছাকৃতভাবে fail করছি
      if (success) {
        resolve("Data fetched successfully");
      } else {
        reject("Failed to fetch data");
      }
    });
    console.log(result);  // যদি promise সফল হয়
  } catch (error) {
    console.log("Caught error:", error);  // যদি promise ব্যর্থ হয়
  }
}

fetchData();

এখানে, async ফাংশনের মধ্যে await ব্যবহার করে Promise এর ফলাফল নেওয়া হয়েছে এবং try...catch দিয়ে ত্রুটি পরিচালনা করা হয়েছে।


৩. Promise.all() এবং Promise.race()

Promise.all()

Promise.all() একাধিক Promise কে একসাথে চালানোর জন্য ব্যবহার করা হয়। এটি একটি অ্যারে নেয় এবং সব Promise সফল হলে, একটি array হিসেবে রেজাল্ট ফেরত দেয়। যদি কোনো একটি Promise ব্যর্থ হয়, তবে পুরো অ্যারে reject হয়ে যাবে।

let promise1 = new Promise((resolve) => resolve("First"));
let promise2 = new Promise((resolve) => resolve("Second"));
let promise3 = new Promise((resolve, reject) => reject("Error"));

Promise.all([promise1, promise2, promise3])
  .then((results) => {
    console.log(results);  // ["First", "Second", "Error"]
  })
  .catch((error) => {
    console.log("Error:", error);  // "Error"
  });

Promise.race()

Promise.race() একাধিক Promise নিলেও, প্রথম Promise যেটি সফল বা ব্যর্থ হবে, তার ফলাফল রিটার্ন করবে।

let promise1 = new Promise((resolve) => setTimeout(resolve, 100, "First"));
let promise2 = new Promise((resolve) => setTimeout(resolve, 50, "Second"));

Promise.race([promise1, promise2])
  .then((result) => {
    console.log(result);  // "Second" (কারণ এটি আগে রেজাল্ট ফেরত দিয়েছে)
  })
  .catch((error) => {
    console.log("Error:", error);
  });

সারাংশ

  • Promises হল অ্যাসিনক্রোনাস প্রোগ্রামিংয়ের একটি গুরুত্বপূর্ণ উপাদান, যা কাজের ফলাফল বা ত্রুটি ভবিষ্যতে পাওয়া যাবে এমন আশ্বাস প্রদান করে।
  • Promise এর তিনটি স্টেট রয়েছে: pending, resolved, এবং rejected
  • .then() এবং .catch() মেথড দিয়ে Promise এর ফলাফল এবং ত্রুটি পরিচালনা করা হয়।
  • Error Handling হল ত্রুটির সঠিকভাবে চিহ্নিত করা এবং সেই অনুযায়ী ব্যবস্থা নেওয়া।
  • async/await সিমপ্লিফাইড অ্যাসিনক্রোনাস কোড লেখার জন্য ব্যবহৃত হয় এবং try...catch দিয়ে ত্রুটি হ্যান্ডলিং করা হয়।
  • Promise.all() একাধিক promise কে একসাথে সম্পন্ন করতে ব্যবহৃত হয়, এবং Promise.race() প্রথমে সফল বা ব্যর্থ হওয়া promise এর ফলাফল নেয়।
Content added By

Async/Await এর মাধ্যমে কোড Simplification

178

Async/Await হল Promises এর ওপর ভিত্তি করে একটি সিনট্যাক্স যা অ্যাসিনক্রোনাস কোড লেখার প্রক্রিয়াকে আরও সহজ ও পরিষ্কার করে। Promises ব্যবহার করেও অ্যাসিনক্রোনাস কোড লেখা সম্ভব, তবে Async/Await সিনট্যাক্সের মাধ্যমে কোডটি আরও সিনক্রোনাস দেখতে হয়, ফলে এটি পড়তে সহজ হয় এবং কোডের জটিলতা কমে যায়।

এখানে, আমরা Async/Await এর মাধ্যমে কোড কীভাবে সিম্পলিফাই (সহজতর) করা যায়, তা দেখব।


১. Promises ব্যবহার করা

প্রথমে, অ্যাসিনক্রোনাস কোডে Promises ব্যবহার করার মাধ্যমে কিছু ডাটা ফেচ করার উদাহরণ দেখা যাক:

Promise এর মাধ্যমে অ্যাসিনক্রোনাস কোড

function fetchData() {
    return new Promise((resolve, reject) => {
        setTimeout(() => {
            const data = 'Fetched Data';
            resolve(data);
        }, 2000);
    });
}

function processData() {
    fetchData().then(data => {
        console.log(data);  // Output: Fetched Data
    }).catch(err => {
        console.log('Error:', err);
    });
}

processData();

এখানে, fetchData() একটি Promise রিটার্ন করছে এবং processData() ফাংশনটি সেই Promise এর মাধ্যমে ডেটা গ্রহণ করছে। এই পদ্ধতিতে .then() এবং .catch() এর মাধ্যমে সফল বা ত্রুটি পরিচালনা করা হয়।


২. Async/Await ব্যবহার করা

এখন, Async/Await ব্যবহার করে একই কাজ কীভাবে আরো সহজ এবং পরিষ্কারভাবে করা যায় তা দেখব।

Async/Await এর মাধ্যমে একই কোড

async function fetchData() {
    return new Promise((resolve, reject) => {
        setTimeout(() => {
            const data = 'Fetched Data';
            resolve(data);
        }, 2000);
    });
}

async function processData() {
    try {
        const data = await fetchData();
        console.log(data);  // Output: Fetched Data
    } catch (err) {
        console.log('Error:', err);
    }
}

processData();

এখানে, fetchData এবং processData দুটি ফাংশনই asyncawait কিওয়ার্ডটি ব্যবহার করে, আমরা fetchData() ফাংশনের রেজাল্টের জন্য অপেক্ষা করি এবং তা পাওয়ার পর কনসোলে প্রিন্ট করি। কোডটি অনেক বেশি সিনক্রোনাস দেখতে লাগে এবং কোডের জটিলতা অনেক কমে যায়।


৩. Multiple Async Functions একসাথে কল করা

ধরা যাক, আমাদের একাধিক অ্যাসিনক্রোনাস ফাংশন আছে এবং আমরা তাদের সমান্তরালভাবে (concurrently) একসাথে চালাতে চাই। Async/Await এর মাধ্যমে এটি করা সহজ।

Promise Chaining

function fetchData1() {
    return new Promise((resolve) => {
        setTimeout(() => {
            resolve('Data from API 1');
        }, 1000);
    });
}

function fetchData2() {
    return new Promise((resolve) => {
        setTimeout(() => {
            resolve('Data from API 2');
        }, 1500);
    });
}

function processData() {
    fetchData1().then(data1 => {
        console.log(data1);
        return fetchData2();
    }).then(data2 => {
        console.log(data2);
    });
}

processData();

এখানে, প্রথমে fetchData1() ফাংশনটি চলে এবং পরে .then() এর মাধ্যমে fetchData2() চালানো হয়।

Async/Await এর মাধ্যমে

async function fetchData1() {
    return new Promise((resolve) => {
        setTimeout(() => {
            resolve('Data from API 1');
        }, 1000);
    });
}

async function fetchData2() {
    return new Promise((resolve) => {
        setTimeout(() => {
            resolve('Data from API 2');
        }, 1500);
    });
}

async function processData() {
    const data1 = await fetchData1();
    console.log(data1);
    const data2 = await fetchData2();
    console.log(data2);
}

processData();

এখানে, দুটি ফাংশন একে একে কল করা হয়েছে। তবে, await এর মাধ্যমে প্রতিটি ফাংশনের জন্য অপেক্ষা করা হচ্ছে। এটি Promise chaining এর চেয়ে আরও পরিষ্কার এবং সিনক্রোনাস কোডের মতো মনে হয়।


৪. Multiple Async Functions একসাথে চালানো (Promise.all)

যখন আপনি একাধিক অ্যাসিনক্রোনাস অপারেশনকে একসাথে (সমান্তরালে) চালাতে চান, তখন Promise.all() ব্যবহার করতে পারেন। এটি সবগুলো প্রমিসের রেজাল্ট একত্রে ফেরত দেয়।

Promise.all ব্যবহার করা

async function fetchData1() {
    return new Promise((resolve) => {
        setTimeout(() => {
            resolve('Data from API 1');
        }, 1000);
    });
}

async function fetchData2() {
    return new Promise((resolve) => {
        setTimeout(() => {
            resolve('Data from API 2');
        }, 1500);
    });
}

async function processData() {
    const [data1, data2] = await Promise.all([fetchData1(), fetchData2()]);
    console.log(data1);  // Output: Data from API 1
    console.log(data2);  // Output: Data from API 2
}

processData();

এখানে, Promise.all() ব্যবহার করে দুইটি ফাংশনকে সমান্তরালে চালানো হচ্ছে, এবং একসাথে তাদের রেজাল্ট নিয়ে আসা হচ্ছে। এটি কোডকে আরও efficiency এবং performance এর দিক থেকে উন্নত করে।


সারাংশ

  • Async/Await অ্যাসিনক্রোনাস কোড লেখাকে আরও সহজ ও পরিষ্কার করে। এটি সিনক্রোনাস কোডের মতো কাজ করে, তবে অ্যাসিনক্রোনাস প্রক্রিয়া পরিচালনা করে।
  • Async/Await ব্যবহার করার মাধ্যমে, কোড আরও readable এবং maintainable হয়, যেখানে callback hell এবং promise chaining এর সমস্যাগুলি কমে যায়।
  • Promise.all() ব্যবহার করে একাধিক অ্যাসিনক্রোনাস ফাংশন সমান্তরালে (concurrently) একসাথে চালানো যায়, যা সময় সাশ্রয়ী এবং আরও কার্যকরী হয়।

এভাবে, Async/Await ব্যবহারের মাধ্যমে আপনার কোড আরও সোজা, পরিষ্কার এবং পরিচালনা করা সহজ হয়।

Content added By
Promotion
NEW SATT AI এখন আপনাকে সাহায্য করতে পারে।

Are you sure to start over?

Loading...